package com.zeyu.soc.log.utils;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;

public class ArgusUtils {

	// ================================================================
	// Constants
	// ================================================================

	private static int MAX_PORT = 65535;

	// ================================================================
	// Fields
	// ================================================================

	// ================================================================
	// Constructors
	// ================================================================

	// ================================================================
	// Methods from/for super Interfaces or SuperClass
	// ================================================================

	// ================================================================
	// Public or Protected Methods
	// ================================================================

	public static Map<String, String> args2map(String args) {
		if (args == null) {
			args = "";
		}
		String[] pairs = args.split(",");

		Map<String, String> argMap = new HashMap<String, String>();
		for (String s : pairs) {
			int i = s.indexOf('=');
			String key, value = "";
			if (i != -1) {
				key = s.substring(0, i).trim();
				if (i + 1 < s.length()) {
					value = s.substring(i + 1).trim();
				}
			} else {
				key = s;
			}
			argMap.put(key, value);
		}

		return argMap;
	}

	public static String map2argus(Map<String, String> argMap) {
		if (null == argMap || argMap.size() == 0) {
			return "";
		}
		StringBuilder sb = new StringBuilder();
		for (Entry<String, String> entry : argMap.entrySet()) {
			sb.append(entry.getKey()).append("=").append(entry.getValue()).append(",");

		}
		return sb.toString().substring(0, sb.length() - 1);
	}

	public static boolean isPortAvaliable(int port) {
		Socket socket = null;
		try {
			socket = new Socket("127.0.0.1", port);
		} catch (UnknownHostException ex) {
		} catch (IOException ex) {
			socket = null;
		}
		if (socket != null) {
			try {
				socket.close();
			} catch (IOException e) {
			}
			return false;
		}
		return true;
	}

	public static int generateAvaliablePort() {
		for (int i = 0; i < 5; i++) {
			int port = new Random().nextInt(MAX_PORT);
			if (isPortAvaliable(port)) {
				return port;
			}
		}

		throw new RuntimeException("can not generate availbale port in 5 times!");

	}

	// ================================================================
	// Getter & Setter
	// ================================================================

	// ================================================================
	// Private Methods
	// ================================================================

	// ================================================================
	// Inner or Anonymous Class
	// ================================================================

	// ================================================================
	// Test Methods
	// ================================================================
}
